课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html

视频地址:https://www.bilibili.com/video/BV1RE411g7rQ?p=1

参考资料:https://blog.csdn.net/qq_44574333/category_10304412_2.html

备注:图片均来自于课件。

由于工作的原因不得不重拾这门课,这次回顾P3至P5,这部分介绍了语音识别的基本概念,输入输出以和各种Seq2seq模型。

语音识别(Speech Recognition)

语音识别是指将语音转换成文本的过程,其模式如下图所示:

  • 输入:语音——向量序列(长度$T$,维度$d$)。
  • 输出:文本——token序列(长度$N$,$V$个不同的token),通常$T> N$。

一些应用:

语音识别有两种视角,第一种视角是将语音识别看成Seq-to-seq问题,第二种是利用传统的HMM视角:

这部分将介绍Seq-to-seq视角的模型,首先介绍一些基本知识。

输入

声学特征

利用滑动窗口的思想,构建一定长度的窗口(一般为25ms),如果采样率为16KHz,那么可以得到400个采样点。但实际中通常不使用该方法,在深度学习流行之前,一般计算MFCC,现在一般使用filter bank的输出。在计算完一个窗口后,将窗口移动10ms,然后重复之前的计算即可,所以1s的声音信号会变成100帧信息。

结合下图更容易理解:

有关MFCC以及filter bank的进一步信息可以参考:

http://ocw.aca.ntu.edu.tw/ntu-ocw/ocw/cou/104S204/7

使用趋势

19年语音领域的国际会议中,以上几种声学特征使用的比例为:

所以主要以filter bank output为主,MFCC其次。

输出

Token

token可翻译为词例,是表示文本的基本单位,在不同情形下可以选择不同的单位作为token,下面回顾课程中介绍的几种单位。

音素(Phoneme)

音素是声音的基本单位。例如:

W AH N P AH N CH M AE N

要得到文本,我们需要词汇表(Lexicon),其记录了文本和音素的对应关系:

利用词汇表,可将之前的声音信号转换为文本:

one punch man

在深度学习流行之前,主要是利用音素的方法进行语音识别,但是音素和词汇表需要语言学家来构建。

字素(Grapheme)

字素是基本的书写单位,注意字素不需要词汇表。

中英文的例子如下:

英语的字素包括26个字母,空格以及标点符号;中文的字素为文字,常用的大约有4000个。

使用字素的一个挑战是,相同的发音可能对应多个字素,例如发音“ke”可能对应c或k,这一点需要结合上下文判断;另一个挑战是,系统需要自己学会拼写单词,所以难免有拼写错误的问题。

词汇(Word)

缺点:词汇数量太多,中文需要分词。

比较夸张的例子如下:

语素(Morpheme)

词素是语言中有意义的基本单位(小于词汇,大于字素)。

可以利用统计或者语言学的方法得到词素。

比特(Bytes)

例如使用UTF_8编码,该系统可以是独立于语言的!

使用趋势

19年语音领域的国际会议中,以上几种token使用的比例为:

主流是音素和字素。

数据集

常见的数据集如下:

Seq-to-seq视角

  • Listen, Attend, and Spell (LAS)
  • Connectionist Temporal Classification (CTC)
  • Recurrent Neural Aligner(RNA)
  • RNN Transducer (RNN-T)
  • Neural Transducer
  • Monotonic Chunkwise Attention (MoChA)

在19年的国际会议中,各种模型的使用比例为:

LAS

LAS是带注意力机制的典型seq2seq模型,Listen是Encoder,Attend是Attention,Spell是Decoder。

Listen

作用:

  • 提取内容信息。
  • 消除speaker差异,消除噪音。

输入:

  • 声学特征:$\left\{x^{1}, x^{2}, \ldots, x^{T}\right\}$

输出:

  • 高阶表达:$\left\{h^{1}, h^{2}, \ldots, h^{T}\right\}$

整体架构如下:

具体架构可以使用RNN,CNN,Self-attention。

RNN:

CNN:

  • CNN较高层的filter可以考虑更长的序列。
  • CNN + RNN结合使用很常见。
降采样

语音识别中常常对输入的声学信号使用降采样,因为输入太长,具体方式如下:

左边将两个时间点的输出结合起来的到一个输出;右边将两个时间段的输出选择一个输出。

其他方法:

左边的思路是做卷积的时候只考虑开头和结尾的部分;右边的思路是不计算全部向量的attention,只计算一定范围内向量的attention,这是因为声学向量太长的原因。

Attend

Attent即为attention:

$z^0$和Encoder的输出根据match函数计算值(标量),然后利用softmax函数计算权重,最后利用下式计算$c^0$(文献中通常被称为context vector):

$c^0$一般作为decoder的输入。

其他形式的attention

之前attention计算的结果影响的是下一时刻,实际中也可以让attention影响当前时刻,甚至两者都影响:

Location-aware attention

attention提出的目的是为了解决机器翻译中输入输出对齐的问题,但是在语音中,对应关系比较明显,当前时刻的输出基本只当前时刻的输入有关。

为了解决这点,有人提出了location-aware attention的方法:

其思路是考虑前一时刻的$\hat \alpha$,通过变换后将其输入到match函数中,这样在计算当前时刻的$\hat \alpha$时也考虑了前一时刻的$\hat \alpha$,我们希望attention在逐渐向右移动。

一些实验结果:

不过从实验结果来看这点好像不起作用。

Spell

根据$c^0$计算$z^1$,然后计算概率分布,采样概率最大的token:

下一步利用$z^1$计算attention,然后重复之前的计算过程:

在解码的过程中,使用了贪心的方法——每次选择概率最大的token,但是这样很容易产生不好的结果,一个例子如下:

  • 红色路径是贪婪法。
  • 绿色路径是最好的路径。

解决该问题的方法是Beam Search:每一步保留$B$个最好的路径,这样的结果是:

训练

训练的过程中使用Teacher Forcing的方法,其方式是不使用前一刻的输出作为当前时刻的输入,取而代之的是使用正确结果作为输入,具体如下:

该方法的目的是保证在输入正确的条件下,输出尽可能正确;如果不使用该方法,很容易在输入正确的情形下产生不好的输出。

局限性

  • LAS在听完整个句子后才产生第一个token。
  • 但是用户期望在线语音识别。

CTC

CTC只包含Encoder,对于在线语音识别,Encoder中使用单向RNN即可:

由于声学向量只表示很短的声音信号,所以有时候无法判断出对应的token。为了解决这点,使用一个特殊的符号$\phi $表示无法判断,这也是输出维度加$1$的原因。

  • 输入:$T$个声学特征,输出$T$个token(忽略下采样)。
  • 输出:token,包括$\phi$,合并重复的token,删除$\phi$。

例子:

训练

我们的训练数据中没有$\phi$,所以产生训练数据需要利用算法预处理,处理的过程称为对齐(alignment)。

考虑如下例子:

后续会介绍具体方法。

问题

无法产生形如book的token。

RNA

CTC Decoder以一个向量为输入,输出一个token;RNA考虑了依赖性,具体方法是将输出部分换成RNN:

RNN-T

RNN-T是对RNA的改进,其思路是一个输入可以产生多个输出,直到产生$\phi$时才读入下一个输入:

工作方式:

更具体的:

最上方的部分是一个RNN,该RNN不考虑$\phi$,其作用有两点:

  • 该RNN类似于语言模型,可以预训练。
  • 更本质的,训练时需要该RNN。(后续介绍)

训练

在RNN-T中,一个输入对应一个$\phi$,所以如果有$T$个输入,那么也有$T$个$\phi$,所以在训练中也有对齐的问题(和CTC类似),具体的解决方法后续介绍。

Neural Transducer

Neural Transducer的改进点是一次输入多个声学特征:

具体来说,每一步利用attention从window中抽取特征,直至输出$\phi$。

MoChA

MoChA是对Neural Transducer的改进,改进点为窗口移动的距离不是固定的,即动态移动窗口(注意窗口长度依然是固定的):

具体过程:

MoChA每个window产生一个token,并且不会输出$\phi$。

训练

由于选择window有采样的步骤(不可微),所以训练步骤比较麻烦,具体可见:

https://zhuanlan.zhihu.com/p/99389088

其核心思路是利用期望值(可导)代替采样(不可导),这部分理解透彻之后会加以补充。

总结

本讲的内容可以用下图概括: